/*-------------------------------------------------------------------------
 *
 * procsignal.h
 *	  进程间信号的例程
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/storage/procsignal.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef PROCSIGNAL_H
#define PROCSIGNAL_H

#include "storage/backendid.h"


/*
 * 发送信号给 Postgres 子进程（后端或辅助进程，如检查点）的原因。
 * 我们可以同时处理不同原因的并发信号。 然而，如果在快速连续中
 * 发送相同的原因多次信号，进程可能只观察到一次通知。这针对目前的
 * 使用是可以的。
 *
 * 同样，由于竞争条件，重要的是定义所有信号，以便在进程错误地
 * 收到一个时不会造成伤害。
 */
typedef enum
{
	PROCSIG_CATCHUP_INTERRUPT,	/* sinval 追赶中断 */
	PROCSIG_NOTIFY_INTERRUPT,	/* listen/notify 中断 */
	PROCSIG_PARALLEL_MESSAGE,	/* 来自合作并行后端的消息 */
	PROCSIG_WALSND_INIT_STOPPING,	/* 请求 walsenders 准备关机 */
	PROCSIG_BARRIER,			/* 全局障碍中断 */
	PROCSIG_LOG_MEMORY_CONTEXT, /* 请求后端记录内存上下文 */

	/* 恢复冲突原因 */
	PROCSIG_RECOVERY_CONFLICT_DATABASE,
	PROCSIG_RECOVERY_CONFLICT_TABLESPACE,
	PROCSIG_RECOVERY_CONFLICT_LOCK,
	PROCSIG_RECOVERY_CONFLICT_SNAPSHOT,
	PROCSIG_RECOVERY_CONFLICT_BUFFERPIN,
	PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK,

	NUM_PROCSIGNALS				/* 必须是最后一个！ */
} ProcSignalReason;

typedef enum
{
	PROCSIGNAL_BARRIER_SMGRRELEASE	/* 请求 smgr 关闭文件 */
} ProcSignalBarrierType;

/*
 * procsignal.c 中函数的原型
 */
extern Size ProcSignalShmemSize(void);
extern void ProcSignalShmemInit(void);

extern void ProcSignalInit(int pss_idx);
extern int	SendProcSignal(pid_t pid, ProcSignalReason reason,
						   BackendId backendId);

extern uint64 EmitProcSignalBarrier(ProcSignalBarrierType type);
extern void WaitForProcSignalBarrier(uint64 generation);
extern void ProcessProcSignalBarrier(void);

extern void procsignal_sigusr1_handler(SIGNAL_ARGS);

#endif							/* PROCSIGNAL_H */
